package net.intellect.collectpro.objects;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import net.intellect.collectpro.gestores.AsignacionCiclo;
import net.intellect.collectpro.util.LiberacionComparator;
import net.intellect.collectpro.util.MontoLiberacionComparator;

import com.sforce.soap.enterprise.ID;

public class AsignacionMP {
	
	ID idMora = null;
	Cola cola = null;
	ID idRebalse = null;
	List<ScoreLiberacion> liberaciones = new ArrayList<ScoreLiberacion>();
	List<Cobro> cobros = new ArrayList<Cobro>();

		
	public AsignacionMP(ID idMora,Cola cola,ID idRebalse,List<ScoreLiberacion> liberaciones) {
		this.idMora = idMora;
		this.cola = cola;
		this.idRebalse = idRebalse;
		this.liberaciones = liberaciones;		
	}

	public ID getIdMora() {
		return idMora;
	}

	public void setIdMora(ID idMora) {
		this.idMora = idMora;
	}

	public Cola getCola() {
		return cola;
	}

	public void setCola(Cola cola) {
		this.cola = cola;
	}

	public ID getIdRebalse() {
		return idRebalse;
	}

	public void setIdRebalse(ID idRebalse) {
		this.idRebalse = idRebalse;
	}

	public List<ScoreLiberacion> getLiberaciones() {
		return liberaciones;
	}

	public void setLiberaciones(List<ScoreLiberacion> liberaciones) {
		this.liberaciones = liberaciones;
	}

	public List<Cobro> getCobros() {
		return cobros;
	}

	public void setCobros(List<Cobro> cobros) {
		this.cobros = cobros;
	}
	
	
	//Coloca los cobros en su conf de score correspodiente
	//Los q no se pueden asignar, se dejan en la lista de cobros
	public boolean colocarCobrosEnScoreLiberacion() {
		try {			
			if (cobros.size()>0 && liberaciones.size()>0) {
				//Pone la bandera marca en false
				AsignacionCiclo.limpiarMarcaCobros(cobros);
				
				List<ScoreLiberacion> liberacionesByMonto = new ArrayList<ScoreLiberacion>();
				List<ScoreLiberacion> liberacionesByScore = new ArrayList<ScoreLiberacion>();
				//Separa las liberaciones por tipo ()
				this.getLiberacionByTipo(liberacionesByMonto,liberacionesByScore);
				
				for (Iterator<Cobro> iter= cobros.iterator();iter.hasNext();) {
					Cobro cobro = iter.next();
					boolean encontrada = false;
					for (ScoreLiberacion scoreLiberacion:liberacionesByMonto) {
						if (cobro.getPagoContadoConsolidado()<scoreLiberacion.getMonto()) {
							if (cobro.isEsNuevo()) {
								cobro.getCobro__c().setGrupo_Score__c("Monto < " + scoreLiberacion.getMonto());
							}
							scoreLiberacion.getCobros().add(cobro);
							iter.remove();
							encontrada = true;
							break;
						}
					}
					
					if (!encontrada) {
						for (ScoreLiberacion scoreLiberacion:liberacionesByScore) {
							if (cobro.getScore()>=scoreLiberacion.getScoreDesde() && cobro.getScore()<=scoreLiberacion.getScoreHasta()) {
								if (cobro.isEsNuevo()) {
									cobro.getCobro__c().setGrupo_Score__c("De " + scoreLiberacion.getScoreDesde() + " - Hasta " + scoreLiberacion.getScoreHasta());
								}
								scoreLiberacion.getCobros().add(cobro);
								iter.remove();
								break;
							}
						}
					}
				}
				Collections.sort(liberaciones,new LiberacionComparator());
			}
			return true;
		} catch (Exception e) {
			return false; 
		}
	}
	
	public Date generarFecha(Date fechaInicioCiclo,int dias) {
		Calendar miCal = Calendar.getInstance();
	    miCal.setTime(fechaInicioCiclo);
	    miCal.add(Calendar.DATE,dias-1);
	    return miCal.getTime();
	}
	
	protected void getLiberacionByTipo(List<ScoreLiberacion> liberacionesByMonto,List<ScoreLiberacion> liberacionesByScore) {
		for(ScoreLiberacion liberacion:liberaciones) {
			if (liberacion.getTipo().equals(ScoreLiberacion.TIPO_LIBERACION_MONTO)) {
				liberacionesByMonto.add(liberacion);
			} else {
				liberacionesByScore.add(liberacion);
			}
		}
		Collections.sort(liberacionesByMonto, new MontoLiberacionComparator());
	}
	
}
